#include <stdio.h>
#include <stdarg.h>// 变长参数头文件
 
void my_printf(const char *str, ...)
{
    unsigned char type_index[128][2] = {0};
 
    int val_agr = 0; // 获取参数个数
       
    va_list arg_list;// 创建列表
      
    va_start(arg_list, str); // 初始化列表
 
    for (size_t i = 0; '\0' != str[i]; i++)
    {
        if ('%' == str[i])
        {
            type_index[i][1] = str[i + 1];
            
            switch (type_index[i][1])
            {
            case 'd':
                printf("%d", va_arg(arg_list, int));
                break;
            case 'f':
                printf("%f", va_arg(arg_list, double));
                break;
            case 's':
                printf("%s", va_arg(arg_list, char *));
                break;
            case 'c':
                printf("%c", va_arg(arg_list, int));
                break;
            default:
                break;
            }
            i++; //跳过类型符号
        }
        else {
            putchar(str[i]);//若不是%？ 则直接打印
        }
    }
    //释放列表
    va_end(arg_list);
}
 
int main(int argc, char const *argv[])
{
    my_printf("%s\t的年龄为%d\t成绩=%f\t等级为:%c\n\n", "张三",18, 90.9 , 'A');
    return 0;
}